home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyo (Python 2.5)
-
- from mapping import Storage, to_storage
- import logging
- import struct
- log = logging.getLogger('util.primitives.structures')
-
- class enum(list):
-
- def __init__(self, *args):
- list.__init__(self, args)
-
-
- def __getattr__(self, elem):
- return self.index(elem)
-
-
- def __getitem__(self, i):
- if isinstance(i, basestring):
- return self.__getattr__(i)
- else:
- return list.__getitem__(self, i)
-
-
-
- def new_packable(fmt, byteorder = '!', invars = None):
- if not invars:
- pass
- invars = []
- slots = fmt[::2]
- fmtstring = byteorder + ''.join(fmt[1::2])
-
- class packable(None, 'packable', (object,)):
- __slots__ = slots
- _fmt = fmtstring
- invariants = invars
-
- def unpack(cls, data):
- o = cls(*struct.unpack(cls._fmt, data))
- return o
-
- unpack = classmethod(unpack)
-
- def __init__(self, *a, **kw):
- i = -1
- for i, d in enumerate(a):
- setattr(self, self.__slots__[i], d)
-
- for field in self.__slots__[i + 1:]:
- setattr(self, field, 0)
-
- for k in kw:
- setattr(self, k, kw[k])
-
-
-
- def pack(self):
- return struct.pack((self._fmt,), *(lambda .0: for field in .0:
- getattr(self, field))(self.__slots__))
-
-
- def __iter__(self):
- return (lambda .0: for s in .0:
- (s, getattr(self, s)))(self.__slots__)
-
-
- def __len__(self):
- return struct.calcsize(self._fmt)
-
- __str__ = pack
-
- def __eq__(self, other):
- o = ()
- for slot in self.__slots__:
- sval = getattr(self, slot)
- oval = getattr(other, slot, o)
- if oval is o:
- return False
-
- if oval != sval:
- return False
- continue
-
- return True
-
-
- def __ne__(self, other):
- return not self.__eq__(other)
-
-
- def copy(self):
- return self.unpack(self.pack())
-
-
- return packable
-
-
- def unpack_named(format, *args):
- data = args[-1]
- rest = None
- if 'R' in format:
- if format.find('R') != len(format) - 1:
- raise AssertionError('R character in format string to unpack_named can only appear at the end')
- else:
- format = format[:-1]
- sz = struct.calcsize(format)
- rest = data[sz:]
- data = data[:sz]
-
- tup = struct.unpack(format, data)
- magic_hash = { }
- for i in xrange(len(tup)):
- magic_hash[args[i]] = tup[i]
-
- if rest:
- magic_hash[args[i + 1]] = rest
-
- return to_storage(magic_hash)
-
-
- def remove_from_list(my_list, remove_these):
- my_list = my_list[:]
- remove_list = _[1]
- for e in remove_list:
- my_list.remove(e)
-
- return my_list
-
-
- class oset(set):
-
- def __init__(self, iterable = []):
- self.data = []
- self.update(iterable, init = True)
-
-
- def add(self, val):
- if val not in self.data:
- self.data.append(val)
- set.add(self, val)
-
-
-
- def __getitem__(self, n):
- return self.data[n]
-
-
- def __iter__(self):
- return iter(self.data)
-
-
- def clear(self):
- del self.data[:]
- set.clear(self)
-
-
- def pop(self):
- ret = set.pop(self)
- self.data.remove(ret)
- return ret
-
-
- def remove(self, item):
- self.data.remove(item)
- set.remove(self, item)
-
-
- def discard(self, item):
-
- try:
- self.remove(item)
- except ValueError:
- pass
- except KeyError:
- pass
-
-
-
- def union(self, other):
- if not isinstance(other, oset):
- other = oset(other)
-
- return self | other
-
-
- def __or__(self, other):
- if not isinstance(other, set):
- raise ValueError, 'other must be a set'
-
- ret = oset(self)
- ret.update(other)
- return ret
-
-
- def intersection(self, other):
- if not isinstance(other, oset):
- other = oset(other)
-
- return self & other
-
-
- def __and__(self, other):
- if not isinstance(other, set):
- raise ValueError, 'other must be a set'
-
- a = oset(self)
- b = other
- return a - a - b
-
-
- def difference(self, other):
- other = oset(other)
- return self - other
-
-
- def __sub__(self, other):
- if not isinstance(other, set):
- raise ValueError, 'other must be a set'
-
- first = oset(self)
- first -= other
- return first
-
-
- def symmetric_difference(self, other):
- if not isinstance(other, oset):
- other = oset(other)
-
- return self ^ other
-
-
- def __xor__(self, other):
- if not isinstance(other, set):
- raise ValueError, 'other must be a set'
-
- return (self | other) - (self & other)
-
-
- def copy(self):
- return oset(self)
-
-
- def update(self, other, init = False):
- if not isinstance(other, oset) and not init:
- other = oset(other)
-
- self.__ior__(other, init = init)
-
-
- def __ior__(self, other, init = False):
- if not isinstance(other, set) and not init:
- raise ValueError, 'other must be a set'
-
- for i in other:
- self.add(i)
-
- return self
-
-
- def intersection_update(self, other):
- if not isinstance(other, oset):
- other = oset(other)
-
- self &= other
-
-
- def __iand__(self, other):
- if not isinstance(other, set):
- raise ValueError, 'other must be a set'
-
- self -= self & other
-
-
- def difference_update(self, other):
- if not isinstance(other, oset):
- other = oset(other)
-
- self -= other
-
-
- def __isub__(self, other):
- if not isinstance(other, set):
- raise ValueError, 'other must be a set'
-
- for item in other:
- self.discard(item)
-
- return self
-
-
- def symmetric_difference_update(self, other):
- if not isinstance(other, oset):
- other = oset(other)
-
- self ^= other
-
-
- def __ixor__(self, other):
- if not isinstance(other, set):
- raise ValueError, 'other must be a set'
-
- b = oset(other)
- b -= self
- self -= other
- self |= b
- return self
-
-
-
- class roset(oset):
-
- def add(self, val):
- if val in self:
- self.data.remove(val)
- self.data.append(val)
- else:
- oset.add(self, val)
-
-
- def insert(self, idx, item):
- if item in self:
- self.data.remove(item)
-
- self.data.insert(idx, item)
- set.add(self, item)
-
-
-
- class EmptyQueue(Exception):
- pass
-
-
- class PriorityQueue(object):
- default_priority = 5
-
- def __init__(self, *args):
- self.q = [ (self.default_priority, arg) for arg in args ]
-
- self.key = lambda a: a[0]
- self.q.sort(key = self.key)
-
-
- def __len__(self):
- return len(self.q)
-
-
- def count(self, x):
- return self.q.count(x)
-
-
- def peek(self):
- if not self.q:
- raise EmptyQueue
-
- (__, item) = self.q[0]
- return item
-
-
- def __iadd__(self, elemtuple):
- if isinstance(elemtuple, (tuple, list)):
- if len(elemtuple) != 2:
- raise TypeError('add to the PriorityQueue like += (item, priority) or just += item')
-
- self.append(*elemtuple)
- else:
- self.append(elemtuple)
- return self
-
-
- def __nonzero__(self):
- return self.q.__len__()
-
-
- def append(self, item, priority = default_priority):
- self.q.append((priority, item))
- self.q.sort(key = self.key)
-
-
- def next(self):
- (__, item) = self.q.pop(0)
- return item
-
-
- def __repr__(self):
- return '<PriorityQueue %r>' % self.q
-
-
- if __name__ == '__main__':
- import doctest
- doctest.testmod(verbose = True)
-
-